<?php
class Statistike
{
    protected $skolas;

    public function Statistike($skolas)
    {
        $this->skolas = $skolas;
    }

    public function skolaList()
    {
       $list = array();

       foreach($this->skolas as $skola_id => $skola_ime)
       {
          list($mesto, $prosek, $br_ocena, $br_zaposlenih, $br_ucenika, $br_izostanaka, $opravdani, $neopravdani) = $this->skolaLine($skola_id);
          $list[$skola_id] = array('ime' => $skola_ime, 'mesto' => $mesto, 'prosek' => $prosek, 'br_ocena' => $br_ocena, 'br_zaposlenih' => $br_zaposlenih, 'br_ucenika' => $br_ucenika, 'br_izostanaka' => $br_izostanaka, 'opravdani' => $opravdani, 'neopravdani' => $neopravdani);
       }

       return $list;
    }

    public function skolaLine($skola_id)
    {
       $mesto = DbFinder::from('Skola')->select('Mesto')->findPk($skola_id);
       $razred_ids = $this->getSkolaRazreds($skola_id);
       $ocene = DbFinder::from('Ocena')->select(array('Suma', 'Broj'))->withColumn('SUM(ocena)', 'Suma')->withColumn('Count(id)', 'Broj')->where('RazredId', 'in', $razred_ids)->findOne();
       if($ocene['Broj'] > 0)
         $prosek = number_format($ocene['Suma']/$ocene['Broj'], 2);
       else $prosek = 0;
       $br_zaposlenih = DbFinder::from('Profesor')->select('Suma')->withColumn('Count(id)', 'Suma')->where('SkolaId', $skola_id)->findOne();
       $br_ucenika= DbFinder::from('Ucenik')->select('Suma')->withColumn('Count(id)', 'Suma')->where('SkolaId', $skola_id)->findOne();
       $izostanci = DbFinder::from('Izostanak')->select(array('Suma', 'Opravdan'))->withColumn('Count(id)', 'Suma')->withColumn('Sum(opravdan)', 'Opravdan')->where('RazredId', 'in', $razred_ids)->findOne();

       return array($mesto, $prosek, $ocene['Broj'], $br_zaposlenih, $br_ucenika, $izostanci['Suma'], $izostanci['Opravdan'], ($izostanci['Suma'] - $izostanci['Opravdan']));
    }

    public function predmetList($skola_id)
    {
       $razred_ids = $this->getSkolaRazreds($skola_id);
       $predmets = $this->getSkolaPredmets($skola_id);
       $predmet_ids = array_keys($predmets);

       $ocena_dbs = DbFinder::from('Ocena')->select(array('PredmetId', 'Suma', 'Broj'))->withColumn('SUM(ocena)', 'Suma')->withColumn('Count(id)', 'Broj')->where('RazredId', 'in', $razred_ids)->where('PredmetId', 'in', $predmet_ids)->groupBy('PredmetId')->find();
       $ocenas = array();
       foreach($ocena_dbs as $ocena_db)
       {
          if($ocena_db['Broj'] > 0)
            $prosek = number_format($ocena_db['Suma'] / $ocena_db['Broj'], 2);
          else
            $prosek = 0;
          $ocenas[$ocena_db['PredmetId']] = array($prosek, $ocena_db['Broj']);
       }

       return array($predmets, $ocenas);
    }

    public function razredList($skola_id)
    {
       $razred_ids = $this->getSkolaRazreds($skola_id);
       $razred_dbs = DbFinder::from('Razred')->where('SkolaId', $skola_id)->where('Smer.Tip', '<>', SmerPeer::$tip['grupni'])->orderBy('Razred')->orderBy('Slovo')->find();
       $razreds = array();
       foreach($razred_dbs as $razred_db)
         $razreds[$razred_db->getId()] = (string) $razred_db;

       $ocena_dbs = DbFinder::from('Ocena')->select(array('RazredId', 'Suma', 'Broj'))->withColumn('SUM(ocena)', 'Suma')->withColumn('Count(id)', 'Broj')->where('RazredId', 'in', $razred_ids)->groupBy('RazredId')->find();
       $ocenas = array();
       foreach($ocena_dbs as $ocena_db)
       {
          if($ocena_db['Broj'] > 0)
            $prosek = number_format($ocena_db['Suma'] / $ocena_db['Broj'], 2);
          else
            $prosek = 0;
          $ocenas[$ocena_db['RazredId']] = array($prosek, $ocena_db['Broj']);
       }

       $ucenik_dbs = DbFinder::from('Ucenik')->select(array('Suma', 'RazredId'))->withColumn('Count(id)', 'Suma')->where('SkolaId', $skola_id)->groupBy('RazredId')->find();
       $uceniks = array();
       foreach($ucenik_dbs as $ucenik_db)
         $uceniks[$ucenik_db['RazredId']] = $ucenik_db['Suma'];

       $izostak_dbs = DbFinder::from('Izostanak')->select(array('Suma', 'Opravdan', 'RazredId'))->withColumn('Count(id)', 'Suma')->withColumn('Sum(opravdan)', 'Opravdan')->where('RazredId', 'in', $razred_ids)->groupBy('RazredId')->find();
       $izostanaks = array();
       foreach($izostak_dbs as $izostak_db)
         $izostanaks[$izostak_db['RazredId']] = array($izostak_db['Suma'], $izostak_db['Opravdan']);

       return array($razreds, $ocenas, $izostanaks, $uceniks);
    }

    public function razredPredmet($skola_id, $razred_id)
    {
       $razred = DbFinder::from('Razred')->findPk($razred_id);
       $predmets = $razred->getPredmetFulls(0);
       unset($predmets[0]);
       $predmet_ids = array_keys($predmets);

       $ocena_dbs = DbFinder::from('Ocena')->select(array('PredmetId', 'Suma', 'Broj'))->withColumn('SUM(ocena)', 'Suma')->withColumn('Count(id)', 'Broj')->where('RazredId', $razred_id)->groupBy('PredmetId')->find();
       $ocenas = array();
       foreach($ocena_dbs as $ocena_db)
       {
          if($ocena_db['Broj'] > 0)
            $prosek = number_format($ocena_db['Suma'] / $ocena_db['Broj'], 2);
          else
            $prosek = 0;
          $ocenas[$ocena_db['PredmetId']] = array($prosek, $ocena_db['Broj']);
       }

       return array($predmets, $ocenas);
    }

    public function razredRazred($skola_id, $razred_id)
    {
       $ucenik_dbs = UcenikPeer::getJoin()->where('SkolaId', $skola_id)->where('RazredId', $razred_id)->orderBy('RedBr')->orderBy('Prezime')->orderBy('Ime')->find();
       $uceniks = array();
       foreach($ucenik_dbs as $ucenik_db)
         $uceniks[$ucenik_db->getId()] = $ucenik_db->joinIme();

       $ocena_dbs = DbFinder::from('Ocena')->select(array('UcenikId', 'Suma', 'Broj'))->withColumn('SUM(ocena)', 'Suma')->withColumn('Count(id)', 'Broj')->where('RazredId', $razred_id)->groupBy('UcenikId')->find();
       $ocenas = array();
       foreach($ocena_dbs as $ocena_db)
       {
          if($ocena_db['Broj'] > 0)
            $prosek = number_format($ocena_db['Suma'] / $ocena_db['Broj'], 2);
          else
            $prosek = 0;
          $ocenas[$ocena_db['UcenikId']] = array($prosek, $ocena_db['Broj']);
       }

       return array($uceniks, $ocenas);
    }

    public function skolaUnos($skola_id, $mesec, $godina)
    {
       $razred_ids = $this->getSkolaRazreds($skola_id);
       $ocenas = array();
       $ocena_dbs = DbFinder::from('Ocena')->select('CreatedAt')->where('RazredId', 'in', $razred_ids)->whereCustom('YEAR(Ocena.CreatedAt)=?', $godina)->whereCustom('MONTH(Ocena.CreatedAt)=?', $mesec)->find();
       foreach($ocena_dbs as $ocena_db)
       {
          $dan = $ocena_db[8].$ocena_db[9];
          if(isset($ocenas[$dan]))
            $ocenas[$dan] ++ ;
          else $ocenas[$dan] = 1;
       }

       $izostanaks = array();
       $izostanak_dbs = DbFinder::from('Izostanak')->select('Datum')->where('RazredId', 'in', $razred_ids)->whereCustom('YEAR(Izostanak.Datum)=?', $godina)->whereCustom('MONTH(Izostanak.Datum)=?', $mesec)->find();
       foreach($izostanak_dbs as $izostanak_db)
       {
          $dan = $izostanak_db[8].$izostanak_db[9];
          if(isset($izostanaks[$dan]))
            $izostanaks[$dan] ++ ;
          else $izostanaks[$dan] = 1;
       }

       $domacis = array();
       $domaci_dbs = DbFinder::from('Domaci')->select('Datum')->where('RazredId', 'in', $razred_ids)->whereCustom('YEAR(Domaci.Datum)=?', $godina)->whereCustom('MONTH(Domaci.Datum)=?', $mesec)->find();
       foreach($domaci_dbs as $domaci_db)
       {
          $dan = $domaci_db[8].$domaci_db[9];
          if(isset($domacis[$dan]))
            $domacis[$dan] ++ ;
          else $domacis[$dan] = 1;
       }

       $obavestenjes = array();
       $obavestenje_dbs = DbFinder::from('Obavestenje')->select('CreatedAt')->where('SkolaId', $skola_id)->whereCustom('YEAR(Obavestenje.CreatedAt)=?', $godina)->whereCustom('MONTH(Obavestenje.CreatedAt)=?', $mesec)->find();
       foreach($obavestenje_dbs as $obavestenje_db)
       {
          $dan = $obavestenje_db[8].$obavestenje_db[9];
          if(isset($obavestenjes[$dan]))
            $obavestenjes[$dan] ++ ;
          else $obavestenjes[$dan] = 1;
       }

       return array($ocenas, $izostanaks, $domacis, $obavestenjes);
    }

    public function logiranje($tip, $username, $strana)
    {
       $br_strana = 50;
       if($strana > 1)
         $pocetak = ($strana - 1) * $br_strana;
       else $pocetak = 0;

       $logiranjes = array();
       if($tip == '')
         return $logiranjes;

       else if($tip == ProfilPeer::$tip['profesor'])
       {
          if($username == '')
          {
            $logiranje_dbs = DbFinder::from('Logiranje')->join('Profil')->join('Profesor')->withColumn('Profil.Tip', 'Tip')->withColumn('Profil.Ime', 'Ime')->withColumn('Profil.Prezime', 'Prezime')->withColumn('Profil.Username', 'Username')->withColumn('Profesor.SkolaId', 'Skola')->where('Profesor.SkolaId', 'in', array_keys($this->skolas))->orderBy('CreatedAt', 'desc')->offset($pocetak)->limit($br_strana)->find();
            $broj = DbFinder::from('Logiranje')->join('Profil')->join('Profesor')->select('Broj')->withColumn('count(*)', 'Broj')->where('Profesor.SkolaId', 'in', array_keys($this->skolas))->findOne();
          }
          else
          {
             $logiranje_dbs = DbFinder::from('Logiranje')->join('Profil')->join('Profesor')->withColumn('Profil.Tip', 'Tip')->withColumn('Profil.Ime', 'Ime')->withColumn('Profil.Prezime', 'Prezime')->withColumn('Profil.Username', 'Username')->withColumn('Profesor.SkolaId', 'Skola')->where('Profesor.SkolaId', 'in', array_keys($this->skolas))->where('Profil.Username', 'like', "%$username%")->orderBy('CreatedAt', 'desc')->offset($pocetak)->limit($br_strana)->find();
             $broj = DbFinder::from('Logiranje')->join('Profil')->join('Profesor')->select('Broj')->withColumn('count(*)', 'Broj')->where('Profesor.SkolaId', 'in', array_keys($this->skolas))->where('Profil.Username', 'like', "%$username%")->findOne();
          }

          foreach($logiranje_dbs as $logiranje_db)
          {
             $logiranjes[] = array($logiranje_db->getCreatedAt(), $logiranje_db->getTip(), $logiranje_db->getColumn('Tip'), $logiranje_db->getColumn('Ime'), $logiranje_db->getColumn('Prezime'), $logiranje_db->getColumn('Username'), $logiranje_db->getColumn('Skola'));
          }
       }

       else if($tip == ProfilPeer::$tip['roditelj'])
       {
          if($username == '')
          {
            $logiranje_dbs = DbFinder::from('Logiranje')->join('Profil')->join('Roditelj')->withColumn('Profil.Tip', 'Tip')->withColumn('Profil.Ime', 'Ime')->withColumn('Profil.Prezime', 'Prezime')->withColumn('Profil.Username', 'Username')->withColumn('Roditelj.SkolaId', 'Skola')->where('Roditelj.SkolaId', 'in', array_keys($this->skolas))->orderBy('CreatedAt', 'desc')->offset($pocetak)->limit($br_strana)->find();
            $broj = DbFinder::from('Logiranje')->join('Profil')->join('Roditelj')->select('Broj')->withColumn('count(*)', 'Broj')->where('Roditelj.SkolaId', 'in', array_keys($this->skolas))->findOne();
          }
          else
          {
             $logiranje_dbs = DbFinder::from('Logiranje')->join('Profil')->join('Roditelj')->withColumn('Profil.Tip', 'Tip')->withColumn('Profil.Ime', 'Ime')->withColumn('Profil.Prezime', 'Prezime')->withColumn('Profil.Username', 'Username')->withColumn('Roditelj.SkolaId', 'Skola')->where('Roditelj.SkolaId', 'in', array_keys($this->skolas))->where('Profil.Username', 'like', "%$username%")->orderBy('CreatedAt', 'desc')->offset($pocetak)->limit($br_strana)->find();
             $broj = DbFinder::from('Logiranje')->join('Profil')->join('Roditelj')->select('Broj')->withColumn('count(*)', 'Broj')->where('Roditelj.SkolaId', 'in', array_keys($this->skolas))->where('Profil.Username', 'like', "%$username%")->findOne();
          }
          foreach($logiranje_dbs as $logiranje_db)
          {
             $logiranjes[] = array($logiranje_db->getCreatedAt(), $logiranje_db->getTip(), $logiranje_db->getColumn('Tip'), $logiranje_db->getColumn('Ime'), $logiranje_db->getColumn('Prezime'), $logiranje_db->getColumn('Username'), $logiranje_db->getColumn('Skola'));
          }
       }

       else if($tip == ProfilPeer::$tip['ucenik'])
       {
          if($username == '')
          {
            $logiranje_dbs = DbFinder::from('Logiranje')->join('Profil')->join('Ucenik')->withColumn('Profil.Tip', 'Tip')->withColumn('Profil.Ime', 'Ime')->withColumn('Profil.Prezime', 'Prezime')->withColumn('Profil.Username', 'Username')->withColumn('Ucenik.SkolaId', 'Skola')->where('Ucenik.SkolaId', 'in', array_keys($this->skolas))->orderBy('CreatedAt', 'desc')->offset($pocetak)->limit($br_strana)->find();
            $broj = DbFinder::from('Logiranje')->join('Profil')->join('Ucenik')->select('Broj')->withColumn('count(*)', 'Broj')->where('Ucenik.SkolaId', 'in', array_keys($this->skolas))->findOne();
          }
          else
          {
             $logiranje_dbs = DbFinder::from('Logiranje')->join('Profil')->join('Ucenik')->withColumn('Profil.Tip', 'Tip')->withColumn('Profil.Ime', 'Ime')->withColumn('Profil.Prezime', 'Prezime')->withColumn('Profil.Username', 'Username')->withColumn('Ucenik.SkolaId', 'Skola')->where('Ucenik.SkolaId', 'in', array_keys($this->skolas))->where('Profil.Username', 'like', "%$username%")->orderBy('CreatedAt', 'desc')->offset($pocetak)->limit($br_strana)->find();
             $broj = DbFinder::from('Logiranje')->join('Profil')->join('Ucenik')->select('Broj')->withColumn('count(*)', 'Broj')->where('Ucenik.SkolaId', 'in', array_keys($this->skolas))->where('Profil.Username', 'like', "%$username%")->findOne();
          }
          foreach($logiranje_dbs as $logiranje_db)
          {
             $logiranjes[] = array($logiranje_db->getCreatedAt(), $logiranje_db->getTip(), $logiranje_db->getColumn('Tip'), $logiranje_db->getColumn('Ime'), $logiranje_db->getColumn('Prezime'), $logiranje_db->getColumn('Username'), $logiranje_db->getColumn('Skola'));
          }
       }

       else if($tip == ProfilPeer::$tip['operater'])
       {
          $razreds = array();
          foreach($this->skolas as $skola_id => $skola_ime)
            $razreds = array_merge($razreds, $this->getSkolaRazreds($skola_id));


          $operaters = DbFinder::from('OperaterRazred')->select('Operater')->withColumn('distinct(operater_id)', 'Operater')->where('RazredId', 'in', $razreds)->find();
          if($username == '')
          {
            $logiranje_dbs = DbFinder::from('Logiranje')->join('Profil')->withColumn('Profil.Tip', 'Tip')->withColumn('Profil.Ime', 'Ime')->withColumn('Profil.Prezime', 'Prezime')->withColumn('Profil.Username', 'Username')->where('Profil.Id', 'in', $operaters)->orderBy('CreatedAt', 'desc')->offset($pocetak)->limit($br_strana)->find();
            $broj = DbFinder::from('Logiranje')->join('Profil')->select('Broj')->withColumn('count(*)', 'Broj')->where('Profil.Id', 'in', $operaters)->findOne();
          }
          else
          {
             $logiranje_dbs = DbFinder::from('Logiranje')->join('Profil')->withColumn('Profil.Tip', 'Tip')->withColumn('Profil.Ime', 'Ime')->withColumn('Profil.Prezime', 'Prezime')->withColumn('Profil.Username', 'Username')->where('Profil.Id', 'in', $operaters)->where('Profil.Username', 'like', "%$username%")->orderBy('CreatedAt', 'desc')->offset($pocetak)->limit($br_strana)->find();
             $broj = DbFinder::from('Logiranje')->join('Profil')->select('Broj')->withColumn('count(*)', 'Broj')->where('Profil.Id', 'in', $operaters)->where('Profil.Username', 'like', "%$username%")->findOne();
          }
          foreach($logiranje_dbs as $logiranje_db)
          {
             $logiranjes[] = array($logiranje_db->getCreatedAt(), $logiranje_db->getTip(), $logiranje_db->getColumn('Tip'), $logiranje_db->getColumn('Ime'), $logiranje_db->getColumn('Prezime'), $logiranje_db->getColumn('Username'), 0);
          }
       }

       return array($logiranjes, intval($broj/$br_strana));
    }

    public function clanarina($skola_id)
    {
       $rows = array();

       $razreds = $this->getSkolaRazredObjects($skola_id);

       $clanarina_dbs = DbFinder::from('Roditelj')->leftJoin('Roditelj.Id', 'Ucenik.RoditeljId')->select(array('RazredId', 'Broj'))->where('Roditelj.SkolaId', $skola_id)->withColumn('Ucenik.RazredId', 'RazredId')->withColumn('count(roditelj.id)', 'Broj')->where('Roditelj.Clanarina', '>', date('Y-m-d'))->groupBy('Ucenik.RazredId')->find();
       $clanarina_br = DbFinder::from('Roditelj')->select('Broj')->where('Roditelj.SkolaId', $skola_id)->withColumn('count(roditelj.id)', 'Broj')->where('Roditelj.Clanarina', '>', date('Y-m-d'))->findOne();
       $clanarinas = array();
       foreach($clanarina_dbs as $clanarina_db)
         $clanarinas[$clanarina_db['RazredId']] = $clanarina_db['Broj'];

       $kredit_dbs = DbFinder::from('Roditelj')->leftJoin('Roditelj.Id', 'Ucenik.RoditeljId')->select(array('RazredId', 'Broj'))->where('Roditelj.SkolaId', $skola_id)->withColumn('Ucenik.RazredId', 'RazredId')->withColumn('count(roditelj.id)', 'Broj')->where('Roditelj.Kredit', '>', Functions::$sms_cena)->groupBy('Ucenik.RazredId')->find();
       $kredit_br = DbFinder::from('Roditelj')->select('Broj')->where('Roditelj.SkolaId', $skola_id)->withColumn('count(roditelj.id)', 'Broj')->where('Roditelj.Kredit', '>', Functions::$sms_cena)->findOne();
       $kredits = array();
       foreach($kredit_dbs as $kredit_db)
         $kredits[$kredit_db['RazredId']] = $kredit_db['Broj'];

       $tst_soc_dbs = DbFinder::from('Roditelj')->leftJoin('Roditelj.Id', 'Ucenik.RoditeljId')->select(array('RazredId', 'Test', 'Socijala'))->where('Roditelj.SkolaId', $skola_id)->withColumn('Ucenik.RazredId', 'RazredId')->withColumn('sum(roditelj.clanarina_tst)', 'Test')->withColumn('sum(roditelj.clanarina_soc)', 'Socijala')->groupBy('Ucenik.RazredId')->find();
       $tst_soc_br = DbFinder::from('Roditelj')->select(array('Test', 'Socijala'))->where('Roditelj.SkolaId', $skola_id)->withColumn('sum(roditelj.clanarina_tst)', 'Test')->withColumn('sum(roditelj.clanarina_soc)', 'Socijala')->findOne();
       $tst_socs = array();
       foreach($tst_soc_dbs as $tst_soc_db)
         $tst_socs[$tst_soc_db['RazredId']] = array($tst_soc_db['Test'], $tst_soc_db['Socijala']);

       $ukupna_suma = DbFinder::from('Uplata')->leftJoin('Uplata.ProfilId', 'Roditelj.Id')->select('Suma')->withColumn('sum(Uplata.Iznos)', 'Suma')->where('Roditelj.SkolaId', $skola_id)->findOne();

       return array($razreds, $clanarinas, $kredits, $tst_socs, $clanarina_br, $kredit_br, $tst_soc_br, $ukupna_suma);
    }

    public function clanarinaRazred($razred_id)
    {
       $ucenik_dbs = UcenikPeer::getJoin()->
                  leftJoin('Ucenik.RoditeljId', 'Roditelj.Id')->
                  with('Roditelj')->
                  where('Ucenik.RazredId', $razred_id)->
                  find();
       $uceniks = array();
       foreach($ucenik_dbs as $ucenik_db)
       {
          $roditelj = $ucenik_db->getRoditelj();
          if(Functions::clanarina($roditelj))
            $uceniks[] = $ucenik_db;
       }

       return $uceniks;
    }

    public function smsLog($godina, $mesec, $dan = null)
    {
       $smss = array();

       $sms_logs = DbFinder::from('SmsLog')->
                   innerJoin('SmsLog.ProfilId', 'Profil.Id')->
                   innerJoin('Profil.Id', 'Roditelj.Id')->
                   select(array('Suma', 'Dan'))->
                   withColumn('count(SmsLog.Id)', 'Suma')->
                   withColumn('DAY(SmsLog.CreatedAt)', 'Dan')->
                   where('Roditelj.SkolaId', 'in', array_keys($this->skolas))->
                   whereCustom('YEAR(SmsLog.CreatedAt)=?', $godina);

       if(!$dan)
       {
          $sms_logs = DbFinder::from('SmsLog')->
                   innerJoin('SmsLog.ProfilId', 'Profil.Id')->
                   innerJoin('Profil.Id', 'Roditelj.Id')->
                   select(array('Suma', 'Dan'))->
                   withColumn('count(SmsLog.Id)', 'Suma')->
                   withColumn('DAY(SmsLog.CreatedAt)', 'Dan')->
                   where('Roditelj.SkolaId', 'in', array_keys($this->skolas))->
                   whereCustom('YEAR(SmsLog.CreatedAt)=?', $godina)->
                   whereCustom('MONTH(SmsLog.CreatedAt)=?', $mesec)->
                   groupBy('Dan')->
                   find();
       }
       else
       {
          $sms_logs = DbFinder::from('SmsLog')->
                   innerJoin('SmsLog.ProfilId', 'Profil.Id')->
                   innerJoin('Profil.Id', 'Roditelj.Id')->
                   select(array('Suma', 'Sat'))->
                   withColumn('count(SmsLog.Id)', 'Suma')->
                   withColumn('HOUR(SmsLog.CreatedAt)', 'Sat')->
                   where('Roditelj.SkolaId', 'in', array_keys($this->skolas))->
                   whereCustom('YEAR(SmsLog.CreatedAt)=?', $godina)->
                   whereCustom('MONTH(SmsLog.CreatedAt)=?', $mesec)->
                   whereCustom('Day(SmsLog.CreatedAt)=?', $dan)->
                   groupBy('Sat')->
                   find();
       }

       return $sms_logs;
    }

    public function uplata($godina, $mesec, $dan = null)
    {
       if(!$dan)
       {
          $uplatas = DbFinder::from('Uplata')->
                      innerJoin('Uplata.ProfilId', 'Profil.Id')->
                      innerJoin('Profil.Id', 'Roditelj.Id')->
                      select(array('Suma', 'Dan'))->
                      withColumn('SUM(Uplata.Iznos)', 'Suma')->
                      withColumn('DAY(Uplata.CreatedAt)', 'Dan')->
                      where('Roditelj.SkolaId', 'in', array_keys($this->skolas))->
                      whereCustom('YEAR(Uplata.CreatedAt)=?', $godina)->
                      whereCustom('MONTH(Uplata.CreatedAt)=?', $mesec)->
                      groupBy('Dan')->
                      find();
       }

       else
       {
          $uplatas = DbFinder::from('Uplata')->
                      innerJoin('Uplata.ProfilId', 'Profil.Id')->
                      innerJoin('Profil.Id', 'Roditelj.Id')->
                      select(array('Suma', 'Ime', 'Prezime', 'ImeMajka', 'PrezimeMajka', 'ImeStaratelj', 'PrezimeStaratelj', 'OtacPok', 'MajkaPok'))->
                      withColumn('SUM(Uplata.Iznos)', 'Suma')->
                      withColumn('DAY(Uplata.CreatedAt)', 'Dan')->
                      withColumn('Profil.Prezime', 'Prezime')->
                      withColumn('Profil.Ime', 'Ime')->
                      withColumn('Roditelj.ImeMajka', 'ImeMajka')->
                      withColumn('Roditelj.PrezimeMajka', 'PrezimeMajka')->
                      withColumn('Roditelj.ImeStaratelj', 'ImeStaratelj')->
                      withColumn('Roditelj.PrezimeStaratelj', 'PrezimeStaratelj')->
                      withColumn('Roditelj.OtacPok', 'OtacPok')->
                      withColumn('Roditelj.MajkaPok', 'MajkaPok')->
                      where('Roditelj.SkolaId', 'in', array_keys($this->skolas))->
                      whereCustom('YEAR(Uplata.CreatedAt)=?', $godina)->
                      whereCustom('MONTH(Uplata.CreatedAt)=?', $mesec)->
                      whereCustom('Day(Uplata.CreatedAt)=?', $dan)->
                      groupBy('Uplata.ProfilId')->
                      find();
       }

       return $uplatas;
    }


    /* Private functions */
    private function getSkolaRazreds($skola_id)
    {
       return DbFinder::from('Razred')->join('Smer')->select('Id')->where('SkolaId', $skola_id)->where('Smer.Tip', '<>', SmerPeer::$tip['grupni'])->find();
    }

    private function getSkolaRazredObjects($skola_id)
    {
       return DbFinder::from('Razred')->join('Smer')->where('SkolaId', $skola_id)->where('Smer.Tip', '<>', SmerPeer::$tip['grupni'])->orderBy('Razred')->orderBy('Slovo')->find();
    }

    private function getSkolaPredmets($skola_id)
    {
       $smers = DbFinder::from('Razred')->innerJoin('Razred.SmerId', 'Smer.Id')->select('SmerId')->withColumn('distinct(smer_id)', 'SmerId')->where('SkolaId', $skola_id)->find();
       $jeziks = DbFinder::from('Razred')->innerJoin('Razred.Jezik', 'Predmet.Id')->select('Id')->withColumn('distinct(jezik)', 'Id')->where('SkolaId', $skola_id)->find();

       $predmet_dbs = DbFinder::from('Predmet')->leftJoin('Predmet.Id', 'PredmetSmer.PredmetId')->select(array('Id', 'Naziv'))->withColumn('distinct(predmet_id)', 'dist')->withColumn('Predmet.Id', 'Id')->withColumn('PredmetNaziv', 'Naziv')->orderBy('Naziv')->where('Predmet.Id', 'in', $jeziks)->orWhere('Predmet.Tip', '<>', PredmetPeer::$tip['placeholder'])->where('PredmetSmer.SmerId', 'in', $smers)->orderBy('Naziv')->find();
       $predmets = array();
       foreach($predmet_dbs as $predmet_db)
         $predmets[$predmet_db['Id']] = $predmet_db['Naziv'];

       return $predmets;
    }

    public static function getRoditeljIme($profil_array)
    {
       if($profil_array['Ime'] and !$profil_array['OtacPok'])
          return $profil_array['Prezime'].' '.$profil_array['Ime'];
       if($profil_array['ImeMajka'] and !$profil_array['MajkaPok'])
          return $profil_array['PrezimeMajka'].' '.$profil_array['ImeMajka'];
       if($profil_array['ImeStaratelj'])
          return $profil_array['PrezimeStaratelj'].' '.$profil_array['ImeStaratelj'];
    }

    // ZAKLJUCNE OCENE

    public static $ignore_predmeti = array('osn 1' => array(2, 1, 11, 4, 5, 12, 17, 18, 23, 21, 22, 35, 36, 46, 121), 'osn 2' => array(17, 18, 23, 21, 22, 35, 36, 46, 121), 'osn 3' => array(17, 18, 23, 21, 22, 35, 36, 46, 121), 'osn 4' => array(17, 18, 23, 21, 22, 35, 36, 46, 121), 'osn 5' => array(17, 18, 23, 21, 22, 35, 36, 46, 121), 'osn 6' => array(17, 18, 21, 22, 35, 36, 46, 121), 'osn 7' => array(17, 18, 21, 22, 35, 36, 46, 121), 'osn 8' => array(17, 18, 21, 22, 35, 36, 46, 121), 'ver' => array(), 'gra' => array(), 'inf' => array(), 'nem' => array());

    /**
    * prosek za jednog ucenika
    * @param array $zakljucne niz zakljucnih ocena
    * @param array $ignore niz predmet_id koji se ignorisu
    * @return array prosek, slovima (1kec, 2kec, 3kec, dovoljan, dobar, vrlodobar, odlican, neocenjen)
    */
    public static function prosek($zakljucne, $ignore)
   {
      $zbir = 0;
      $broj = 0;

      if(in_array(1, $zakljucne))
      {
         $keceva = 0;
         foreach($zakljucne as $ocena)
           if($ocena == 1)
             $keceva ++;
         if($keceva == 1)
           return array(1, '1kec');
         else if ($keceva == 2)
           return array(1, '2kec');
         else if ($keceva > 2)
           return array(1, '3kec');
      }
      else
      {
        foreach($zakljucne as $predmet => $zakljucna)
        {
            if(!in_array($predmet, $ignore))
            {
               $zbir += $zakljucna;
               $broj ++;
            }
        }

      if($broj != 0)
        $uspeh = round($zbir / $broj, 2);
      else return array(0, 'neocenjen');
      }

      if($uspeh >= 2 and $uspeh < 2.5)
        return array($uspeh, 'dovoljan');
      else if($uspeh >= 2.5 and $uspeh < 3.5)
        return array($uspeh, 'dobar');
      else if($uspeh >= 3.5 and $uspeh < 4.5)
        return array($uspeh, 'vrlodobar');
      else if($uspeh >= 4.5)
        return array($uspeh, 'odlican');
   }

}